home *** CD-ROM | disk | FTP | other *** search
/ Sound Fx / Sound Fx.iso / Software / UNZIPED / DWSTK / PLAYDWD.BAS < prev    next >
BASIC Source File  |  1996-10-10  |  6KB  |  189 lines

  1. '******************************************************************************
  2. 'File:      playdwd.bas
  3. 'Version:   2.22
  4. 'Tab stops: every 2 columns
  5. 'Project:   DWD Player
  6. 'Copyright: 1994-1995 DiamondWare, Ltd.  All rights reserved.
  7. 'Written:   Erik Lorenzen & Don Lemmons
  8. 'Purpose:   Contains simple example code to show how to load/play a .DWD file
  9. 'History:   94/10/21 KW Started playdwd.c
  10. '           94/11/12 DL Translated to BASIC
  11. '           95/01/12 EL Cleaned up & Finalized
  12. '           95/03/22 EL Finalized for 1.01
  13. '           95/04/11 EL Finalized for 1.02
  14. '           95/06/06 EL Finalized for 1.03, no changes
  15. '           95/06/06 EL Finalized for 2.00, no changes
  16. '           95/10/07 EL Finalized for 2.10, no changes
  17. '           95/10/18 EL Finalized for 2.20, changed vol's to 95%
  18. '           95/12/07 EL Finalized for 2.21, no changes
  19. '           96/10/10 EL Finalized for 2.22, no changes
  20. '
  21. 'Notes
  22. '-----
  23. 'This code isn't really robust when it comes to standard error checking
  24. 'and particularly recovery, software engineering technique, etc.  A buffer
  25. 'is statically allocated.  A better technique would be to use fstat() or stat()
  26. 'to determine the file's size then malloc(size).    The STK will handle songs
  27. 'larger than 64K (but not digitized sounds).  Obviously, you'd need to fread()
  28. 'such a file in chunks, or write some sort of hfread() (huge fread).  Also,
  29. 'exitting and cleanup is not handled robustly in this code.  The code below can
  30. 'only be validated by extremely careful scrutiny to make sure each case is
  31. 'handled properly.  A better method would the use of C's atexit function.
  32. '
  33. 'But all such code would make this example file less clear; its purpose was
  34. 'to illustrate how to call the STK, not how to write QA-proof software.
  35. '******************************************************************************/
  36.  
  37.  
  38.  
  39. '$INCLUDE: 'dws.bi'
  40. '$INCLUDE: 'err.bi'
  41.  
  42.  
  43.  
  44. TYPE BUFFTYP
  45.     buf AS STRING * 32767
  46. END TYPE
  47.  
  48.  
  49.  
  50. 'DECLARE VARIABLES
  51.     COMMON SHARED dov     AS dwsDETECTOVERRIDES
  52.     COMMON SHARED dres    AS dwsDETECTRESULTS
  53.     COMMON SHARED ideal AS dwsIDEAL
  54.     COMMON SHARED dplay AS dwsDPLAY
  55.  
  56.  
  57.  
  58. DIM SHARED buffer(0) AS BUFFTYP 'set aside string area for song to load into
  59.                                                                 'by doing it this way we give QBasic the
  60.                                                                 'opportunity to place the song into far mem
  61. 'START OF MAIN
  62.  
  63.     PRINT
  64.     PRINT "PLAYDWD 2.22 is Copyright 1994-95, DiamondWare, Ltd."
  65.     PRINT "All rights reserved."
  66.     PRINT : PRINT : PRINT
  67.  
  68.     filename$ = LTRIM$(RTRIM$(COMMAND$))
  69.     IF filename$ = "" THEN
  70.         PRINT "Usage PLAYDWD <dwd-file>"
  71.         GOTO ProgramExit
  72.     END IF
  73.  
  74.     OPEN filename$ FOR BINARY AS #1 LEN = 1
  75.     filelen = LOF(1)
  76.     CLOSE #1
  77.  
  78.     IF filelen = 0 THEN
  79.         PRINT "File Not Found"
  80.         GOTO ProgramExit
  81.     END IF
  82.  
  83.     IF filelen > 32767 THEN
  84.         PRINT "File Too Big"
  85.         GOTO ProgramExit
  86.     END IF
  87.  
  88.     OPEN filename$ FOR BINARY AS #1 LEN = 1
  89.     GET #1, 1, buffer(0).buf
  90.     CLOSE #1
  91.  
  92.     'We need to set every field to -1 in dwsDETECTOVERRIDES struct; this
  93.     'tells the STK to autodetect everything.  Any other value
  94.     'overrides the autodetect routine, and will be accepted on
  95.     'faith, though the STK will verify it if possible.
  96.  
  97.     dov.baseport = -1
  98.     dov.digdma     = -1
  99.     dov.digirq     = -1
  100.  
  101.     IF DWSDetectHardWare(dov, dres) = 0 THEN
  102.         errDisplay
  103.         GOTO ProgramExit
  104.     END IF
  105.  
  106.  
  107.     IF (dres.capability AND dwscapabilityDIG) <> dwscapabilityDIG THEN
  108.  
  109.         IF ((dres.baseport <> 904) AND (dres.baseport <> -1)) THEN
  110.             PRINT dres.baseport
  111.             PRINT "The sound hardware supports digitized sound playback,"
  112.             PRINT "but we couldn't find the DMA channel and/or IRQ level."
  113.         ELSE
  114.             PRINT "Support for digitized playback not found."
  115.         END IF
  116.  
  117.         GOTO ProgramExit
  118.  
  119.     END IF
  120.  
  121.  
  122.     'The "ideal" struct tells the STK how you'd like it to initialize the
  123.     'sound hardware.  In all cases, if the hardware won't support your     r
  124.     'request, the STK will go as close as possible.  For example, not all
  125.     'sound boards will support al sampling rates (some only support 5 or
  126.     '6 discrete rates).
  127.  
  128.     ideal.musictyp     = 0         '0=No music, 1=OPL2
  129.     ideal.digtyp         = 8         '0=No Dig, 8=8bit
  130.     ideal.dignvoices = 16      'number of voices (up to 16)
  131.     ideal.dignchan     = 1         '1=mono
  132.  
  133.     soundseg% = VARSEG(buffer(0).buf)
  134.     soundoff% = VARPTR(buffer(0).buf)
  135.     pointer&    = soundseg% * 256 ^ 2 + soundoff%  'make pointer
  136.  
  137.     ' Set ideal.digrate, in Hz
  138.     IF dwsDGetRateFromDWD(pointer&, ideal.digrate) = 0 THEN
  139.         errDisplay
  140.         GOTO ProgramKill
  141.     END IF
  142.  
  143.     IF dwsInit(dres, ideal) = 0 THEN
  144.         errDisplay
  145.         GOTO ProgramKill
  146.     END IF
  147.  
  148.     'Set master vol to about 95% of max
  149.     IF dwsXMaster(242) = 0 THEN
  150.         errDisplay
  151.     END IF
  152.  
  153.     dplay.snd          = pointer&
  154.     dplay.count      = 1                '0=infinite loop, 1-N num times to play sound
  155.     dplay.priority = 1000
  156.     dplay.presnd     = 0
  157.  
  158.     IF dwsDPlay(dplay)    = 0 THEN
  159.         errDisplay
  160.         GOTO ProgramKill
  161.     END IF
  162.  
  163.     result% = dwsDSOUNDSTATUSPLAYING
  164.     DO UNTIL (result%  AND dwsDSOUNDSTATUSPLAYING) <> dwsDSOUNDSTATUSPLAYING
  165.         IF dwsDSoundStatus(dplay.soundnum, result%) = 0 THEN
  166.             errDisplay
  167.             GOTO ProgramKill
  168.         END IF
  169.     LOOP
  170.  
  171.     ProgramKill:
  172.  
  173.     IF dwsKill = 0 THEN
  174.         errnum = dwsErrNo
  175.         errDisplay
  176.  
  177.         'If an error occurs here, it's either dws_Kill_CANTUNHOOKISR
  178.         'or dws_NOTINITTED.  If it's dws_Kill_CANTUNHOOKISR the user
  179.         'must remove his tsr, and dws_Kill must be called again.  If it's
  180.         'dws_NOTINITTED, there's nothing to worry about at this point.
  181.         IF errnum = dwsKillCANTUNHOOKISR THEN
  182.             GOTO ProgramKill
  183.         END IF
  184.     END IF
  185.  
  186.     ProgramExit:
  187.  
  188. END
  189.